package plp.imperative2.declaration;

import plp.expressions2.expression.Expressao;
import plp.expressions2.expression.Valor;
import plp.expressions2.memory.AmbienteExecucao;
import plp.expressions2.memory.IdentificadorJaDeclaradoException;
import plp.expressions2.memory.IdentificadorNaoDeclaradoException;
import plp.expressions2.memory.VariavelJaDeclaradaException;
import plp.expressions2.memory.VariavelNaoDeclaradaException;
import plp.imperative1.memory.AmbienteCompilacaoImperativa;
import plp.imperative1.memory.EntradaVaziaException;
import plp.imperative2.memory.ContratoException;

/**
 * Uma defini�ao de procedimento � uma declara�ao de comando e parametrosFormais
 * uma declara��o de procedimento.
 */
public abstract class DefDbC {

	protected Expressao condicao;

	public DefDbC(Expressao condicao) {
		this.condicao = condicao;
	}

	public Expressao getCondicao() {
		return condicao;
	}

	public void setCondicao(Expressao condicao) {
		this.condicao = condicao;
	}

	Valor avaliar(AmbienteExecucao amb) throws VariavelNaoDeclaradaException,
			VariavelJaDeclaradaException, ContratoException {
		return condicao.avaliar(amb);
	}

	public boolean checaTipo(AmbienteCompilacaoImperativa ambiente)
			throws IdentificadorJaDeclaradoException,
			IdentificadorNaoDeclaradoException, EntradaVaziaException {
		return condicao.checaTipo(ambiente)
				&& condicao.getTipo(ambiente).eBooleano();
	}
	
	@Override
	public String toString() {
		return condicao.toString();
	}
}
